package initialize

import (
	"fmt"
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"mxshop_srvs/inventory_srv/global"
	"os"
	"time"
)

func InitDB() {
	c := global.ServerConfig.MySQLInfo

	// 构建 DSN
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
		c.User, c.Password, c.Host, c.Port, c.Name)
	zap.S().Infof("Connecting to database with DSN: %s", dsn)

	// 设置日志配置
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold: time.Second, // 慢 SQL 阈值
			LogLevel:      logger.Info, // Log level
			Colorful:      true,        // 禁用彩色打印
		},
	)

	// 初始化 GORM 数据库连接
	var err error
	global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 表名不加复数
		},
		Logger: newLogger,
	})

	if err != nil {
		zap.S().Fatalf("Failed to connect to database: %v", err)
		panic(fmt.Errorf("database connection failed: %w", err))
	}

	// 检查数据库连接
	sqlDB, err := global.DB.DB()
	if err != nil {
		zap.S().Fatalf("Failed to get database instance: %v", err)
		panic(fmt.Errorf("failed to get database instance: %w", err))
	}

	// 配置连接池
	sqlDB.SetMaxOpenConns(10)           // 最大打开连接数
	sqlDB.SetMaxIdleConns(5)            // 最大空闲连接数
	sqlDB.SetConnMaxLifetime(time.Hour) // 连接的最大生命周期

	zap.S().Info("Database connection initialized successfully")
}
